package isdproject.client;

import java.util.ArrayList;

import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;

/**
 * 
 * @author User
 * @version 1.2
 * Vak toevoegen ui: kent 2 textboxen, met labels ervoor, 
 * om een vakcode en een vaknaam op te kunnen geven.
 * Dit kan opgeslagen worden door op de button 'vak toevoegen' te clicken.
 * Er is ook een cancel button.
 * Wanneer er een fout wordt gemaakt, is dat direct te zien in de error labels
 * in het zelfde scherm. 
 *
 */
///had eigenlijk moeten zijn: vakUI
public class VakToevoegen_UI
{
	///!!delegate voor opslag
	private final OpslagServiceDelegate osd;
	//losse variabelen

	/**
	 * Dit error label heeft een classname zodat hij met css aangepast kan worden.
	 */
	private Label l_vaknaamerror, l_vakcodeerror;
	/**
	 * Dit verklarende label heeft een classname zodat hij met css aangepast kan worden.
	 */
	private Label l_vaknaam, l_vakcode;
	private TextBox tb_vaknaam, tb_vakcode;
	///buttons hoeven hier niet bovenin gespecificeerd te worden, maar is overzichtelijker
	private Button b_vaktoevoegen, b_cancel;
	///!array even voor opslag. alleen codes worden opgeslagen even, en gecheckt op of ze al bestaan. namen kunnen immers meerdere keren voorkomen, codes zullen moeten veranderen bv per jaar
	///Een tijdelijke array aangemaakt om de UI te kunnen demonstreren met een functie van de use case.
	public static ArrayList<String> al_vakcodes = new ArrayList<String>();
	
	/**
	 * De constructor voor de UI voor de use case 'vak toevoegen'.
	 */
	public VakToevoegen_UI(final OpslagServiceDelegate osd)
	{
		this.osd = osd;
		//losse variabelen instantieren:
		
		l_vaknaam = new Label("Vaknaam");
		//zie css voor begeleidendlabel opmaak
		l_vaknaam.setStylePrimaryName("begeleidendlabel");
		
		l_vaknaamerror = new Label();
		//zie css voor errorlabel opmaak
		l_vaknaamerror.setStylePrimaryName("errorlabel");
		
		l_vakcode = new Label("Vakcode");
		//zie css voor begeleidendlabel opmaak
		l_vakcode.setStylePrimaryName("begeleidendlabel");
		
		l_vakcodeerror = new Label();
		//zie css voor errorlabel opmaak
		l_vakcodeerror.setStylePrimaryName("errorlabel");
		
		tb_vaknaam = new TextBox();
		tb_vaknaam.setVisibleLength(25);
		
		tb_vakcode = new TextBox();
		tb_vakcode.setVisibleLength(25);
		
		b_vaktoevoegen = new Button("Vak toevoegen", new ClickHandler()
		{
			public void onClick(ClickEvent event)
			{
				//error labels eerst even weer leeg zetten, als deze dat niet al waren
				l_vaknaamerror.setText("");
				l_vakcodeerror.setText("");
				//de methode matches bekijkt of wel aan de syntax invoer voorwaarden wordt voldaan
				///op het moment is nog niet (goed) gespecificeerd wat de invoerrestricties moeten zijn
				///nu gekozen voor minimaal 2 any chars. Echter ook daarvoor is deze regular expression niet goed. Ook mogelijk: [a-zA-Z0-9][a-zA-Z0-9]+")) : minimaal 2 alfabetische of numerieke chars
				if(!tb_vaknaam.getText().matches("[a-zA-Z0-9]"))///("..+"))
				{
					l_vaknaamerror.setText("Foute invoer! Voer minimaal 2 tekens in.");
				}
				///nu gekozen voor deze regular expression, moet nog verbeterd worden!
				if(!tb_vakcode.getText().matches("[A-Z]+-[A-Z0-9]+-[0-9]+"))///("[a-zA-Z0-9]+[-][a-zA-Z0-9]+[-][0-9]+"))
				{
					l_vakcodeerror.setText("Foute invoer! Moet \"aA1-aA1-11\" formaat matchen.");
				}
				///eigenlijk moet nog geschekt worden of waarden al bestaan
				else if(tb_vaknaam.getText().matches("[a-zA-Z0-9]") && tb_vakcode.getText().matches("[A-Z]+-[A-Z0-9]+-[0-9]+"))///else if(tb_vaknaam.getText().matches("..+") && tb_vakcode.getText().matches("[a-zA-Z0-9]+[-][a-zA-Z0-9]+[-][0-9]+"))
				{
					//Vak wordt door het UI toegevoegd aan de database
					Vak vak = new Vak(tb_vaknaam.getText(), tb_vakcode.getText());
					osd.addVak(vak);
				}				
			}
		});
		b_vaktoevoegen.setWidth("120");
		
		b_cancel = new Button("Cancel", new ClickHandler()
		{
			public void onClick(ClickEvent event)
			{
				///nog niet gespecificeerd wat cancel moet doen!
				Window.alert("Cancel");
			}
		});
		b_cancel.setWidth("80");
		
		//widgets toevoegen en layout regelen. 
		//let op! layout zit hem ook in width van labels en buttons
		//of dat nou specifiek gezet is, of komt door de text erop, of door zaken als 'visiblelength'
		Grid g_ = new Grid(7,3);
		g_.setSize("600", "200");
		
		g_.setWidget(0, 0, l_vaknaam);
		g_.setWidget(1, 0, l_vaknaamerror);
		g_.setWidget(3, 0, l_vakcode);
		g_.setWidget(4, 0, l_vakcodeerror);
		g_.setWidget(0, 2, tb_vaknaam);
		g_.setWidget(3, 2, tb_vakcode);
		g_.setWidget(6, 1, b_vaktoevoegen);
		g_.setWidget(6, 2, b_cancel);
		
		RootPanel.get("main").add(g_);
	}
	
}
